package initialize

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jmoiron/sqlx"
	"go-learn/global"
	"time"
)

func Mysql() *sqlx.DB {
	cfg := global.Config.Mysql
	dsn := cfg.Username + ":" + cfg.Password + "@tcp(" + cfg.Addr + ")/" + cfg.DB + "?charset=utf8mb4&parseTime=True"
	db, err := sqlx.Connect("mysql", dsn)
	if err != nil {
		panic(fmt.Sprintf("connect mysql failed, err:%v\n", err))
	}
	fmt.Println("connect mysql success")
	db.SetMaxIdleConns(cfg.MaxIdleConns) // 设置连接池中的最大闲置连接数
	db.SetMaxOpenConns(cfg.MaxOpenConns) // 设置与数据库建立连接的最大数目
	var timeoutTime int64
	var name string
	// 查询数据库的wait_timeout时间
	if err = db.QueryRow("show global variables like 'wait_timeout';").Scan(&name, &timeoutTime); err != nil {
		panic(fmt.Sprintf("Get err: %s\n", err))
	}
	// 连接复用最大时间，不能超过数据库的超时时间，mysql默认的超时时间是8h
	db.SetConnMaxLifetime(time.Duration(timeoutTime-10) * time.Second) // 设置了连接可复用的最大时间
	return db
}
